/*
位运算符
位运算符有限度 

1.位运算符操作的都是整型的数据 
2. << 在一定范围内 每向左移一位 相当于 * 2 
   >> 在一定范围内 每向右移一位 相当于 / 2
*/

class BitTest{
	public static void main(String[] args){
		int i = 21;
		int j = 0b10101;
		// i =  0000 0000 0000 0000 0000 0000 0001 0101 
		System.out.println("i << 2 = " + (i << 2));
		System.out.println("i << 3 = " + (i << 3));
		System.out.println("i << 27 = " + (i << 27));

		System.out.println("i >> 2 = " + (i >> 2));

		int p = -21;
		// p =  1000 0000 0000 0000 0000 0000 0001 0101 
		System.out.println("p << 2 = " + (p << 2));
		System.out.println("p << 3 = " + (p << 3));
		System.out.println("p << 27 = " + (p << 27));

		System.out.println("p >> 2 = " + (p >> 2));


       // &, |, ^, ~
		int m = 12, n = 5;
		
      /*	
        & 只有 1 & 1 结果为 1 其他为 0
        1 & 1 = 1, 1 & 0 = 0, 0 & 0 = 0

        | 只有 0 | 0 结果为 0 其他为 1
        1 | 1 = 1, 1 | 0 = 1, 0 | 0 = 0

        ^  相同为0, 不同为1。 1 ^ 1 和 0 ^ 0 结果为0, 0 ^ 1 和 1 ^ 0 结果为1
        1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 0 = 1

        ~ 各二进制码 按补码 各位取反 1 → 0 , 0 → 1

       m =  0000 0000 0000 0000 0000 0000 0000 1100 
	    n =  0000 0000 0000 0000 0000 0000 0000 0101 
      */		
	    System.out.println("m & n = " + (m & n));
	    //   0000 0000 0000 0000 0000 0000 0000 0100 = 4

	    System.out.println("m | n = " + (m | n));
	    //   0000 0000 0000 0000 0000 0000 0000 1101 = 13 

	    System.out.println("m ^ n = " + (m ^ n));
	    //   0000 0000 0000 0000 0000 0000 0000 1001 = 9

	    System.out.println("~m = " + ~m);
      /*	 m 的补码
            0111 1111 1111 1111 1111 1111 1111 0010
         →  1000 0000 0000 0000 0000 0000 0000 1101 = -13
	    */
       System.out.println("~n = " + ~n);
	   /*  n 的补码
	         0111 1111 1111 1111 1111 1111 1111 1001  
	      →  1000 0000 0000 0000 0000 0000 0000 0110 = -6   
	   */


	   // ***************
	   // 问题1 
	   int num1 = 12, num2 = 5, num3 = 13;
	   System.out.println("num1 = " + num1 + "num2 = " + num2);

	   /*方式1 定义临时变量

	   int temp = num1;
	   num1 = num2;
	   num2 = temp;
	   */

	   /*方式二 
	   好处 不用定义临时变量
	   弊端 I相加超出存储范围 II有局限性： 只能用于数值

	   num1 = num1 + num2;
	   num2 = num1 - num2;
	   num1 = num1 - num2;
	   */

	   // 方式三 使用位运算符
	   // 有局限性

	   num1 ^= num2;
	   num2 ^= num1;
	   num1 ^= num2;

	   System.out.println("num1 = " + num1 + " num2 = " + num2);

	   System.out.println((num1 >= num2 && num1 >= num3)? num1:((num2>=num3)? num2:num3))


	}
}